﻿package {
	//
	/**
	 * ...
	 * @author : AjM
	 * @usage : Managing/Storing content/Data from xml parser and managing the displayObjects of the relavant data at run time.
	 */
	import flash.display.LoaderInfo;
	import flash.display.MovieClip;
	import flash.display.SimpleButton;
	import flash.display.Sprite;
	import fl.containers.ScrollPane;
	import fl.controls.ScrollPolicy;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.MouseEvent;
	import flash.filters.DropShadowFilter;
	import flash.geom.Rectangle;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.display.Stage;
	import flash.external.ExternalInterface;
	import flash.text.TextLineMetrics;
	import flash.utils.clearInterval;
	import flash.utils.getDefinitionByName;
	import flash.display.Loader;
	import flash.net.URLRequest;
	import fl.controls.CheckBox;
	import flash.utils.setInterval;
	import flash.text.TextFormat;
	//
	//Custom class Xmlloader.
	import Xmlloader;
	//Custom CSS class templateCSS.
	//import TemplateCSS;
	//
	// The ClickRevealTerms class contains methods for XML elements and working / arreng stage.
	public class ClickRevealTerms extends Sprite {
		//Here we are passing the XML file path.  
		private var sXMLPath:String = "../xml/clickrevealterms.xml";
		//private var sXMLPath:String = "topic1/xml/textonly.xml";
		private var shellXmlPath:String;
		//public var CSSPath:String;

		//Instantiating  Obeject for XMLLoader Class.
		public var oXMLLoader:Xmlloader = new Xmlloader();

		//Declaring object for XMlList.
		private var xmlNodeData:XML;

		//Declaring object for CSS. 
		//private var templateCSS:TemplateCSS;

		//paraText Array: This will store the data for all instances of para and for bullet list.
		private var paraText:Array;

		//paraType Array: This will store the the type of paras and for bullet list.
		private var paraType:Array;

		//spWidth: This Number variable will store the width of the ScrollPane.
		private var spWidth:Number;

		//spWidth: This Number variable will store the Heigth of the ScrollPane.
		private var spHeigth:Number;

		//bulletArray: This Array will store the All instances of the para/bulleted objects.
		private var bulletArray:Array;
		
		//
		private var bgMc:MovieClip;
		
		//
		private var titleMc:MovieClip;
		
		//titleText: This is the TextField type object refrence for template title.
		private var titleText:TextField;
		
		//instructionText: This is the TextField type object refrence for template instruction.
		private var instructionText:TextField;
		
		//cScrollPane: This is the ScrollPane type object refrence to instanciate ScrollPane.
		private var cScrollPane:ScrollPane;

		//containerMc: This is the Sprite object to passing source of the para object to scrollPane.  
		private var containerMc:Sprite;
		private var shellContainerMc:MovieClip;

		//leftMargin: Will decide the margin from the left border of the object.
		private var leftMargin:Number;
		private var topMargin:Number;
		private var bottMargin:Number;

		//indentMargin: Will decide the indent margin from the left border of the object.
		private var indentMargin:Number;
		private var subBullIndentMargin:Number;
		//spY: This var will define the starting position of the scrollPane from the top.
		private var spY:Number;

		//yPos: This var will define the starting position of the title object from the top.
		private var yPos:Number;

		//vGap: This var will define the distance in-between the two paras/bullets.
		private var vGap:Number;
		//
		private var hGap:Number;
		//
		private var qstnBoxMinHeight:Number;
		
		//
		private var templateXMLpath:String;
		//
		private var shellBg:MovieClip;
		
		
		private var correctItemID:String;
		private var runningLocal:Boolean;
		private var instructionMc:MovieClip;
		private var interval:Number;
		private var popupList:Array;
		private var currentPopupShown:Number;
		private var draggedCardClip:MovieClip;
		private var dragging:Boolean;
		

		//.....This is a constructor for the class ClickRevealTerms.
		public function ClickRevealTerms():void {
			/**
			* @param : XML
			* @return : N/A
			* @usage : Initializing the variables
			*/
			runningLocal = false;
			spY = new Number(0);
			yPos = new Number(85);
			vGap = new Number(10);
			hGap = new Number(10);
			spWidth = new Number(845);
			spHeigth = new Number(448);
			leftMargin = new Number(19);
			topMargin = new Number(10);
			bottMargin = new Number(10);
			indentMargin = new Number(10);
			subBullIndentMargin = new Number(40);
			qstnBoxMinHeight = new Number(66);
			popupList = new Array();
			
			//
			bulletArray = new Array();
			//
			containerMc = new Sprite();
			shellContainerMc = new MovieClip();
			//
			bgMc = new bg_mc();
			//
			titleMc = new title_mc();
			titleText = titleMc.title_txt;
			//
			instructionMc = new instruction_mc();
			instructionText = instructionMc.txt;
			//
			cScrollPane = new ScrollPane();
			//
			
			initializer();
		}
		//Initializer function
		private function initializer():void {
			//This object will pass the xml path to the XMLloader class.
			//Values From XMLPath::
			addEventListener(Event.ADDED_TO_STAGE, addedToStage);
			//
			//This Event will call the getXMLNodes function once loading process of the XML get complet.
			oXMLLoader.addEventListener(XmlloaderEvent.COMPLETED, getXMLNodes);
		}
		private function addedToStage(evt:Event) {
			if (this.parent is Stage) {
				runningLocal = true;
				oXMLLoader.setXmlPath(sXMLPath);
				//CSSPath = "../css/templateCSS.css";
				//templateCSS = new TemplateCSS(this);
				shellBg = new shellBgMc();
				shellContainerMc = new Shadow();
				addChild(shellBg);
				addChild(shellContainerMc);
				shellBg.alpha = .5;
				shellContainerMc.x = 5;
				shellContainerMc.y = 85;
			} else {
				addEventListener(ShellTemplateEvent.SHELLEVELXML, checkShellXMLVal);
				//shellBg.visible = false;
				//shellContainerMc.visible = false;
			}
		}
		private function checkShellXMLVal(evt:ShellTemplateEvent) {
			//
			shellXmlPath = evt.xmlString;
			//
			oXMLLoader.setXmlPath(shellXmlPath);
			//CSSPath = "topic1/css/templateCSS.css";
			//templateCSS = new TemplateCSS(this);
		}
		//getXMLNodes function: This function will be called after XML get loaded.
		private function getXMLNodes(e:Event) {
			// This will pass the XML data list to the xmlNodeData variable.
			xmlNodeData = oXMLLoader.xmlNodes;

			// arrangeStage() function call.
			arrangeStage();

		}
		
		
		//arrangeStage function: arrenging all DisplayObjects on stage.
		private function arrangeStage():void {
			addChild(bgMc);
			
			//.................Attaching the scrollpane
			spY = yPos;
			cScrollPane.horizontalScrollPolicy = ScrollPolicy.OFF;
			cScrollPane.verticalScrollPolicy = ScrollPolicy.OFF;
			cScrollPane.move(0, spY);
			cScrollPane.setSize(spWidth, spHeigth);
			addChild(cScrollPane);
			//trace("SP Done ")
			var newXPos:Number = leftMargin;
			var newYPos:Number = 0//topMargin;
			
			//..................Instruction text will be controll from here
			//instructionText.width = spWidth - (leftMargin * 2) - 5;
			//instructionText.width = 530;
			//instructionText.border = true;
			instructionText.selectable = false;
			//instructionText.styleSheet = templateCSS.sheet;
			
			//.....................font embedding
			instructionText.embedFonts = true
			instructionText.antiAliasType = "advanced";
			instructionText.defaultTextFormat = new TextFormat("Arial");
			
			instructionText.htmlText = xmlNodeData.instText.text();
			instructionText.autoSize = "left";
			instructionText.multiline = true;
			instructionText.wordWrap = true;
			//
			instructionMc.x = newXPos;
			instructionMc.y = newYPos// - (instructionText.height / 2);
			containerMc.addChild(instructionMc);
			//trace("Inst Done");
			//newXPos = leftMargin + titleMc.width + hGap;
			newYPos = instructionMc.y + instructionMc.height + vGap;
			
			//..................Title text will be controll from here
			titleMc.x = newXPos;
			titleMc.y = newYPos;
			containerMc.addChild(titleMc);
			//
			//titleText.width = spWidth - leftMargin;
			//titleText.border = true;
			titleText.selectable = false;
			//titleText.styleSheet = templateCSS.sheet;
			
			//.....................font embedding
			titleText.embedFonts = true
			titleText.antiAliasType = "advanced";
			titleText.defaultTextFormat = new TextFormat("Arial");
			
			titleText.htmlText = xmlNodeData.titleText.text();
			titleText.autoSize = "left";
			titleText.multiline = true;
			titleText.wordWrap = true;
			
			var bodyText:TextField = titleMc.para_txt;
			//bodyText.border = true;
			bodyText.selectable = false;
			//bodyText.styleSheet = templateCSS.sheet;
			
			
			//.....................font embedding
			bodyText.embedFonts = true
			bodyText.antiAliasType = "advanced";
			bodyText.defaultTextFormat = new TextFormat("Arial");
			
			bodyText.htmlText = xmlNodeData.Paragraph.paraText.text();
			bodyText.autoSize = "left";
			bodyText.multiline = true;
			bodyText.wordWrap = true;
			
			titleMc.title_bg.height = titleText.height + bodyText.height - (titleMc.title_bg.y * 2);
			//trace("Title Done")
			
			newYPos = titleText.y + titleText.height + vGap;
			var cards:XMLList = xmlNodeData.cards.children();
			for (var i:uint = 0; i < cards.length(); i++) {
				var cardsNodePointer:XML = cards[i];
				
				var cardTxt:String = cardsNodePointer.cardText.text();
				var popupXML:XMLList = cardsNodePointer.popup;
				//trace("cardTxt = "+cardTxt+"\n\npopupXML = "+popupXML);
				
				var card:MovieClip = new card_mc();
				 card.card_bg.rotation = Math.random() * 2;
				card.name = "card_" + i;
				card.popupIndex = i;
				//var xCordinates:Number = randomNumber(titleMc.width, stage.stageWidth - (card.width*2)) - i * 1.2;
				//var yCordinates:Number = randomNumber(yPos, stage.stageHeight - (card.height * 2));
				var xCordinates:Number = randomNumber(titleMc.width, (bounds_mc.width - card.width));
				var yCordinates:Number = randomNumber(yPos, (bounds_mc.height - card.height));
				trace("xCordinates >> "+xCordinates+" : yCordinates >> "+yCordinates)
				card.x = xCordinates;
				card.y = yCordinates;
				//trace("card.popupIndex >> " + card.popupIndex);
				
				applyDefaultTextFieldSettings(card.txt);
				
				//.....................font embedding
				card.txt.embedFonts = true
				card.txt.antiAliasType = "advanced";
				card.txt.defaultTextFormat = new TextFormat("Arial");
				
				card.txt.htmlText = cardTxt;
				
				/*card.addEventListener(MouseEvent.MOUSE_UP, handleCardEvents);
				card.addEventListener(MouseEvent.MOUSE_OVER, handleCardEvents);
				card.addEventListener(MouseEvent.MOUSE_OUT, handleCardEvents);
				card.addEventListener(MouseEvent.MOUSE_DOWN, handleCardEvents);*/
				card.btn.addEventListener(MouseEvent.CLICK, handleCardEvents);
				
				var dragClip:SimpleButton = card.drag_mc;
				dragClip.addEventListener(MouseEvent.MOUSE_DOWN, cardStartDrag);
				dragClip.addEventListener(MouseEvent.MOUSE_UP, cardStopDrag);
				stage.addEventListener(MouseEvent.MOUSE_UP, cardStopDrag);
				
				addChild(card);
				
				var popup:MovieClip = createPopUp(popupXML);
				popup.visible = false;
				popupList.push(popup);
				addChild(popup);
				//trace("POPUP Added >> "+popup)
			}
			//addContentToScroll()
			//interval = setInterval(addContentToScroll, 1)
			cScrollPane.source = containerMc;
		}
		
		/*private function addContentToScroll():void {
			//trace("addContentToScroll() ")
			clearInterval(interval);
			for (var i = 0; i < tempPopUpSrcClips.length; i++) {
				var pop:MovieClip = tempPopUpSrcClips[i].pop;
				var src:Sprite = tempPopUpSrcClips[i].src;
				pop.sp.source = src;
			}
		}*/
		
		
		function randomNumber(low:Number=NaN, high:Number=NaN):Number {
			var low:Number = low;
			var high:Number = high;

			if (isNaN(low)) {
				throw new Error("low must be defined");
			}
			if (isNaN(high)) {
				throw new Error("high must be defined");
			}

			return Math.floor(Math.random() * (1+high-low)) + low;
		}
		
		private function cardStartDrag(e:MouseEvent) {
			dragging = true;
			draggedCardClip = e.target.parent as MovieClip;
			draggedCardClip.parent.addChild(draggedCardClip);
			//draggedCardClip.startDrag(false, new Rectangle(0, 0 + yPos, stage.stageWidth - draggedCardClip.width, stage.stageHeight - draggedCardClip.height - yPos));
			draggedCardClip.startDrag(false, new Rectangle(0, 0 + yPos, bounds_mc.width - draggedCardClip.width, bounds_mc.height - draggedCardClip.height));
		}
		
		private function cardStopDrag(e:MouseEvent) {
			try {
				draggedCardClip.stopDrag();
			}catch (e) { }
		}
		
		private function handleCardEvents(e:MouseEvent):void {
			if (dragging) {
				dragging = false;
				return;
			}
			var type:String = e.type;
			var target:MovieClip = e.target.parent as MovieClip;
			trace("handleCardEvents() # "+target.name)
			/*if (type == "mouseUp" || type == "mouseOut") {
				target.gotoAndStop("up");
			}
			if (type == "mouseOver") {
				target.gotoAndStop("over");
			}
			if (type == "mouseDown") {
				target.gotoAndStop("hit");
			}*/
			if (type == "click") {
				showPopup(target.popupIndex);
			}
		}
		
		private function showPopup(popupIndex:Number):void {
			//trace("showPopup() # " + popupIndex+" : "+popupList.length);
			currentPopupShown = popupIndex;
			var popup:MovieClip = popupList[currentPopupShown] as MovieClip;
			popup.sp.update();
			popup.parent.addChild(popup);
			popup.visible = true;
		}
		
		private function showNextPopup() {
			hidePopup();
			if ((currentPopupShown + 1) > popupList.length - 1) {
				currentPopupShown = -1;
			}
			
			showPopup(currentPopupShown + 1);
		}
		
		private function showPreviousPopup() {
			hidePopup();
			if ((currentPopupShown - 1) < 0) {
				currentPopupShown = popupList.length;
			}
			showPopup(currentPopupShown - 1);
		}
		
		private function hidePopup() {
			var popup:MovieClip = popupList[currentPopupShown] as MovieClip;
			popup.visible = false;
		}
		
		private function createPopUp(popup_xml:XMLList):MovieClip{
			var popupClip:MovieClip = new popup_mc();
			popupClip.y = yPos;
			popupClip.close_mc.addEventListener(MouseEvent.MOUSE_UP, handlePopupCloseEvents);
			popupClip.close_mc.addEventListener(MouseEvent.MOUSE_OVER, handlePopupCloseEvents);
			popupClip.close_mc.addEventListener(MouseEvent.MOUSE_OUT, handlePopupCloseEvents);
			popupClip.close_mc.addEventListener(MouseEvent.MOUSE_DOWN, handlePopupCloseEvents);
			popupClip.close_mc.addEventListener(MouseEvent.CLICK, handlePopupCloseEvents);
			popupClip.close_mc.buttonMode = true;
			popupClip.patch_mc.mouseChildren = false;
			
			popupClip.back_mc.addEventListener(MouseEvent.MOUSE_UP, handlePopupCloseEvents);
			popupClip.back_mc.addEventListener(MouseEvent.MOUSE_OVER, handlePopupCloseEvents);
			popupClip.back_mc.addEventListener(MouseEvent.MOUSE_OUT, handlePopupCloseEvents);
			popupClip.back_mc.addEventListener(MouseEvent.CLICK, handlePopupCloseEvents);
			popupClip.back_mc.buttonMode = true;
			
			popupClip.next_mc.addEventListener(MouseEvent.MOUSE_UP, handlePopupCloseEvents);
			popupClip.next_mc.addEventListener(MouseEvent.MOUSE_OVER, handlePopupCloseEvents);
			popupClip.next_mc.addEventListener(MouseEvent.MOUSE_OUT, handlePopupCloseEvents);
			popupClip.next_mc.addEventListener(MouseEvent.CLICK, handlePopupCloseEvents);
			popupClip.next_mc.buttonMode = true;
			
			
			var alignType:String = popup_xml.@type;
			var availWidth:Number = popupClip.sp.width - (leftMargin * 2);
			var newX:Number = 0;
			var newY:Number = 0;
			
			var mc:Sprite = new Sprite();
			for each(var prop:XML in popup_xml.elements()) {
				var nodeName:String = prop.name();
				//trace("nodeName = " + nodeName);
				if (nodeName == "title") {
					applyDefaultTextFieldSettings(popupClip.title_txt);
					
					//.....................font embedding
					popupClip.title_txt.embedFonts = true
					popupClip.title_txt.antiAliasType = "advanced";
					popupClip.title_txt.defaultTextFormat = new TextFormat("Arial");
					
					popupClip.title_txt.htmlText = prop.text();
				}
				if (nodeName == "Paragraph") {
					for each(var element:XML in prop.elements()) {
						var name:String = element.name();
						//trace("Element Name = " + name);
						if (name == "image") {
							var imgPath:String = element.@path;
							var imgAlign:String = element.@align;
							var imageClip:MovieClip = new ImagePlaceHolder_mc();
							loadImage(imgPath, imageClip.imageHolder);
							//trace(">> "+imageClip.mask_mc.width)
							if (imgAlign == "left") {
								imageClip.x = newX;
								newX = imageClip.x + imageClip.width + indentMargin;
							}else {
								imageClip.x = availWidth - imageClip.mask_mc.width;
							}
							
							availWidth -= (imageClip.mask_mc.width);
							mc.addChild(imageClip);
						}else {
							var para:MovieClip = new paraMc();
							var txtRef:TextField = para.paraTxt;
							var space:Number;
							applyDefaultTextFieldSettings(txtRef);
							txtRef.width = availWidth;
							
							//.....................font embedding
							txtRef.embedFonts = true
							txtRef.antiAliasType = "advanced";
							txtRef.defaultTextFormat = new TextFormat("Arial");
					
							txtRef.htmlText = element.text();
							if (alignType == "imgLeftTextRight") {
								para.x = newX;
							}
							para.y = newY;
							if (name == "paraText") {
								//trace("para >> ");
								para.bulletDotMc.visible = false;
								para.mediaLinkIcon.visible = false;
								mc.addChild(para);
							}
							if (name == "bulletTxt") {
								//trace("Bullet >> ");
								para.mediaLinkIcon.line_mc.width = 0;
								space = para.width - txtRef.width + indentMargin;
								//trace("space " + para.width + " - " + txtRef.width + " = " + space)
								txtRef.width -= space;
								para.x += space;
								
								para.mediaLinkIcon.visible = false;
								mc.addChild(para);
							}
							if (name == "subBulletTxt") {
								//trace("Sub-bullet >> ");
								para.mediaLinkIcon.line_mc.width = 0;
								space = para.width - txtRef.width + subBullIndentMargin;
								//trace("space " + para.width + " - " + txtRef.width + " = " + space)
								txtRef.width -= space;
								para.x += space;
								//para.y += 10;
								
								para.mediaLinkIcon.visible = false;
								mc.addChild(para);
							}
							if (name == "supplementaryLink") {
								//trace("Link >> ");
								para.mediaLinkIcon.line_mc.width = txtRef.width + para.mediaLinkIcon.allIcons.width;
								space = para.width - txtRef.width;
								//trace("space " + para.width + " - " + txtRef.width + " = " + space)
								txtRef.width -= space;
								para.x += space;
								para.y += 10;
								para.mediaLinkIcon.line_mc.width = txtRef.width + para.mediaLinkIcon.allIcons.width;
								
								para.mediaLinkIcon.visible = true;
								para.mediaLinkIcon.addEventListener(MouseEvent.ROLL_OVER, media_box_overfun);
								para.mediaLinkIcon.addEventListener(MouseEvent.ROLL_OUT, media_box_outfun);
								para.mediaLinkIcon.addEventListener(MouseEvent.MOUSE_DOWN, media_box_downfun);
								mc.addChild(para);
							}
							newY = para.y + para.height + vGap;
						}
					}
				}
			}
			popupClip.sp.source = mc;
			//tempPopUpSrcClips.push( { pop:popupClip, src:mc } );
			return popupClip;
		}
		//var tempPopUpSrcClips:Array = new Array();
		
		function media_box_overfun(e:MouseEvent):void {
			e.currentTarget.buttonMode = true;
			//media_box.mcBlackPatch.visible = true;
			//media_box.mcCaption.visible = true;
		}
		function media_box_outfun(e:MouseEvent):void {
			e.currentTarget.buttonMode = false;
			//media_box.mcBlackPatch.visible = false;
			//media_box.mcCaption.visible = false;
		}
		function media_box_downfun(e:MouseEvent):void {
			var mediaURLOpen:String = "http://www.google.co.in?width=400&height=400";
			var mediaTitle:String = "Google";
			var mediaDes:String = "";
			//media_box.mcBlackPatch.visible = false;
			//media_box.mcCaption.visible = false;
			ExternalInterface.call("$.prettyPhoto.open", mediaURLOpen, mediaTitle, mediaDes);
			//ExternalInterface
		}
		
		private function handlePopupCloseEvents(e:MouseEvent):void {
			var type:String = e.type;
			var target:MovieClip = e.target as MovieClip;
			if (type == "mouseUp" || type == "mouseOut") {
				target.gotoAndStop("up");
			}
			if (type == "mouseOver") {
				target.gotoAndStop("over");
			}
			if (type == "mouseDown") {
				target.gotoAndStop("hit");
			}
			if (type == "click") {
				if(target.name == "close_mc"){
					target.parent.visible = false;
				}
				if (target.name == "back_mc") {
					showPreviousPopup();
				}
				if (target.name == "next_mc") {
					showNextPopup();
				}
			}
		}
		
		private function applyDefaultTextFieldSettings(txtField:TextField) {
			//txtField.border = true;
			txtField.autoSize = "left";
			txtField.multiline = true;
			txtField.wordWrap = true;
			txtField.selectable = false;
			//txtField.styleSheet = templateCSS.sheet;
			
			//.....................font embedding
			txtField.embedFonts = true
			txtField.antiAliasType = "advanced";
			txtField.defaultTextFormat = new TextFormat("Arial");
		}
		
		// This method is called when if the "imgpath" value has an image to load
		private function loadImage(p_imgPath:String, p_imgHolder:MovieClip) {
			var imgPath:String = (runningLocal) ? getLocalPath(p_imgPath) : p_imgPath;
			//trace("imgPath >> " + imgPath);
			// Image Loader
			var loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
			loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			loader.load(new URLRequest(imgPath));
			p_imgHolder.addChild(loader);
		}
		
		// This method is called when an image (if the Radio Button has any) of the Radio button gets loaded
		private function initHandler(e:Event):void {
			//trace("initHandler()")
			var loader:Loader = Loader(e.target.loader);
            var info:LoaderInfo = LoaderInfo(loader.contentLoaderInfo);
			//loadedImagesCount++;
			//checkAssetsLoaded();
		}
		
		/*function customrandom(l:Number, h:Number) {
			var ArrayCriaBolas:Array = new Array();
			for (var u:uint = l; u <= h; u++) {
				ArrayCriaBolas.push(u);
			}
			var ArraySorteiaBolas:Array = new Array();
			while (ArrayCriaBolas.length >0) {
				var w:int = Math.floor(Math.random()*ArrayCriaBolas.length);
				ArraySorteiaBolas.push(ArrayCriaBolas[w]);
				ArrayCriaBolas.splice(w,1);
			}
			//trace(ArraySorteiaBolas);
			return ArraySorteiaBolas;
		}*/
		
		// Error Handler for image loading
		private function ioErrorHandler(e:IOErrorEvent):void {
			trace("** ERROR: " + e.toString());
		}
		
		/* Support function to check the template locally. 
		 * Transforms the xml path to find the images locally in the parent directory
		 */
		private function getLocalPath(p_imagePath:String):String {
			var imagePath:String = ".." + p_imagePath.substring(p_imagePath.indexOf("/"), p_imagePath.length);
			return imagePath;
		}
	}
}